package com.yunzhu.yunzhubookingservice.exception;

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * ModelViewAspect是面向“加了@ModelView注解且抛出异常的这个切面”的类，
 * 功能是把自定义CustomException转为ModelViewException，并抛出，
 * 再由全局异常处理器统一对自定义的ModelViewException异常做（区别于拦截CustomException）异常的处理，即跳转到error.html处理
 *
 * 需求：特定方法抛出自定义异常后跳转到error.html显示异常信息
 * 面向切面编程的好处:避免在程序中大量抛出ModelViewException地方的代码改造（后端开发友好），仅在抛出异常后需要跳转到error.html的方法上加@ModelView注解即可
 */
@Aspect //@Aspect注解说明ModelViewAspect是一个面向切面编程的类
@Component
public class ModelViewAspect {
    //设置切入点，这里配置加了@ModelView注解的方法会被直接拦截
    @Pointcut("@annotation(com.yunzhu.yunzhubookingservice.exception.ModelView)")
    public void pointcut(){}

    /**
     * 当加@ModelView的注解的方法抛出异常的时候，会做如下afterThrowable处理
     */
    @AfterThrowing(pointcut = "pointcut()",throwing = "e")
    public void afterThrowable(Throwable e){
        if(e instanceof CustomException){
            throw ModelViewException.transfer((CustomException)e);
        }
    }
}
